home *** CD-ROM | disk | FTP | other *** search
/ Merciful 4 / Merciful - Disc 4.iso / software / p / psychotoads.dms / psychotoads.adf / a14 < prev    next >
Text File  |  1989-03-31  |  70KB  |  1,811 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.                                14: AMAL                                    176
  9.                      ----------------------------
  10. If you wish to generate the smooth movement required in an arcade game,
  11. it's necessary to move each object on the screen dozens of times a
  12. second. This is a real struggle even in machine code and it's way
  13. beyond the abilities of the fastest version of Basic.
  14.  
  15.   AMOS sidesteps this problem by incorporating a powerful animation
  16. language which is executed independently of your Basic programs. This
  17. is capable of generating high speed animation effects which would be
  18. impossible in standard Basic.
  19.  
  20.   The (AM)os (A)nimation (L)anguage (AMAL) is unique to AMOS Basic. In
  21. can be used to animate anything from a sprite to an entire scren at
  22. incredible speed. Up to 16 AMAL programs can be executed simultaneously
  23. using interrupts.
  24.  
  25.   Each program controls the movements of a single object on the screen.
  26. Objects may be moved in complex predefined attack patterns, created
  27. from a separate editor accessory. You can also control your objects
  28. directly from the mouse or joystick if required.
  29.  
  30.   The sheer versatility of the AMAL system has to be seen to be
  31. believed.
  32.  
  33.  
  34. AMAL principles
  35. ===============
  36. AMAL is effectively just a simple version of Basic which has been
  37. carefully optimised for the maximum possible speed. As with Basic,
  38. there are instructions for program control (Jump), making decisions
  39. (If) and repeating sections of code in loops (For...Next). The real
  40. punch comes when AMAL program is run. Not only are the commands
  41. lightning fast but all AMAL programs are *compiled* before run-time.
  42.  
  43.   AMAL commands are entered using short keywords consisting of one or
  44. more capital letters. Anything in lowercase is ignored completely. This
  45. allows you to pad out your AMAL instructions into something more
  46. readable. So the M command might be entered as Move or the L
  47. instruction as Let.
  48.  
  49.   AMAL instructions can be separated by parctically any unused
  50. characters including spaces. You can't however, use the colon ":" for
  51. this purpose, as it's needed to define a label. We advise you to use a
  52. semi-colon ";" to separate commands to avoid possible AMAL headaches.
  53.  
  54.   There are two ways of creating your AMAL programs. The first is to
  55. produce your animation sequences with the AMAL accessory program and
  56. save them into a memory bank or you can define your animations inside
  57. AMOS Basic using the AMAL command. The general format of this function
  58. is:
  59.  
  60.         AMAL n,a$
  61.  
  62. "n" is the identification number of your new AMAL program. As a default
  63. all programs are assigned to the relevant hardware sprite. So the first
  64. AMAL program controls sprite number one, the second sprite number two,
  65. and so on. You can change this selection at any time using a separate
  66. CHANNEL command. a$ is a string containing a list of AMAL instructions
  67. to be performed in your program. Here's a simple example:
  68.  
  69.         Load "AMOS_DATA:Sprites/Monkey_right.abk"
  70.         Get Sprite Palette
  71.         Sprite 8,130,50,1                                                  177
  72.         Amal 8,"S: M 300,200,100 ; M -300,200,100 J S"
  73.         Amal On 8 : Rem Activate AMAL program number eight
  74.         Direct
  75.  
  76. The program returns you straight back to direct mode with the DIRECT
  77. command. Try typing a few Basic commands at this point. You can see the
  78. movement pattern continues regardless, without interfering with the
  79. rest of the AMOS system. Also note we have used sprite 8 to force the
  80. use of a computed sprite. All computed sprites from 8 to 15 are
  81. automatically assigned to the equivalent channel number by the AMAL
  82. system. So there's no need for any special initialisation procedures.
  83. Unless you wish to restrict the amount of hardware sprites it's safest
  84. to stick to just computed sprites in your programs. Notice how we've
  85. activated the AMAL program using the AMAL ON command. This has the
  86. format:
  87.  
  88.         AMAL ON [prog]
  89.  
  90. "prog" is the number of a single AMAL program. If it's omitted, then
  91. *all* your AMAL programs will be executed at once!
  92.  
  93.  
  94. AMAL tutorial
  95. =============
  96. We'll now provide you with a guided tour of the AMAL system. This
  97. allows you to slowly familiarise yourself with the mechanics of AMAL
  98. programs, without having to worry about too many technical details.
  99.  
  100.   For the time being we'll be concentrating on sprite movements, but
  101. the same principles can also be applied to bob or screen animations.
  102.  
  103.   Start off by loading some examples into memory. These can be found in
  104. in the SPRITES folder on the AMOS data disc. To get a directory of
  105. Sprite files type the following from the direct windows:
  106.  
  107.         Dir "AMOS_DATA:"
  108.  
  109. To load a sprite file, type a line like:
  110.  
  111.         Load "AMOS_DATA:Sprites/Octopus.abk"
  112.  
  113.  
  114. Moving an object
  115. ----------------
  116. As you would expect from a dedicated animation language, AMAL allows
  117. you to move your objects in a variety of different ways. The simplest
  118. of these involves the use of the Move command.
  119.  
  120.  
  121.  
  122.                           Move (move object)
  123.                           -
  124. M w,h,n
  125.  
  126. The M command moves an object  w units to the right and h units down in
  127. exactly n movement steps. If the coordinates of your subject were
  128. (X,Y), then the object would progressively move to X+W,Y+H.
  129.  
  130.   Supposing you have a sprite at coordinates 100,100. The instruction 
  131. M 100,100,100  would move it to 200,200. The speed of this motion          178
  132. depends on the number of movement steps. If n is large then each
  133. individual sprite movement will be small and the sprite will move very
  134. slowly. Conversely, a small value for n results in a large movement
  135. steps which jerk the sprite across the screen at high speed. Here are
  136. some examples of the Move command.
  137.  
  138.         Rem This moves an octopus down the screen using AMAL
  139.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  140.         Sprite 8,300,0,1
  141.         Amal 8,"M 0,250,50" : Amal On 8 : Wait Key
  142.  
  143.         Rem Moves octopus down and across the screen
  144.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  145.         Sprite 10,150,150,1
  146.         Amal 10,"M 300,-100,50" : Amal On 10 : Wait Key
  147.  
  148.         Rem Demonstrates multiple Move commands.
  149.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  150.         M$="Move 300,0,50 ; Move -300,0,50"
  151.         Sprite 11,150,150,1
  152.         Amal 11,M$ : Amal On 11 : Wait Key
  153.  
  154. Notice how we've expanded M to Move in above program. Since the letters
  155. "ove" are in lower case, they will be ignored by the AMAL system.
  156.  
  157.   At first glance, Move is a powerful but unexciting little
  158. instruction. It's ideal for moving objects such as missiles, but
  159. otherwise it's pretty uninspiring.
  160.  
  161.   Actually nothing could be further from the truth. That's because the
  162. parameters in the move instruction are not limited to simple numbers.
  163. You can also use complex arithmetical expressions incorporating one of
  164. a variety of useful AMAL functions. Example:
  165.  
  166.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  167.         Sprite 12,150,150,1 : Amal 12,"Move XM-X,YM-Y,32"
  168.         Amal On 12 : Wait Key
  169.  
  170. This smoothly moves computed sprite 12 to the current mouse position. X
  171. and Y hold the coordinates of your sprite, and XM and YM are functions
  172. returning the current coordinates of the mouse.
  173.  
  174.         It's possible to exploit this effect in games like Pac-Man to
  175. make your objects chase the player's character. Example:
  176.  
  177.         Load Iff "AMOS_DATA:IFF/Frog_Screen.IFF",1
  178.         Channel 1 To Screen Display 1                                      179
  179.         Amal 1,"Move 0,-200,50 ; Move 0,200,50"
  180.         Amal On 1 : Direct
  181.  
  182. Channel assigns an AMOS program to a particular object. We'll be
  183. discussing this command in detail slightly later, but the basic format
  184. is:
  185.  
  186.         CHANNEL p TO object n
  187.  
  188. "p" is the number of your AMAL program. Allowable values range from 0
  189. to 63, although only the first 16 of these programs can be performed
  190. using interrupts.
  191.  
  192.   "object" specifies the type of object you with to control with your
  193. AMAL program. This is indicated using one of the following statements:
  194.  
  195.         Sprite          (values >7 refer to computed sprites)
  196.         Bob             (blitter object)
  197.         Screen Display  (used to move the screen display)
  198.         Screen Offset   (Hardware scrolling)
  199.         Screen Size     (Changes the screen size using interrupts)
  200.         Rainbow         (Animates a rainbow effect)
  201.  
  202. "n" is the number of the object to be animated. This object needs to be
  203. subsequently defined using the SPRITE, BOB or SCREEN open instructions.
  204.  
  205.  
  206. Animation
  207. ---------
  208.  
  209.  
  210.                        Anim (animate an object)
  211.                        -
  212. A n,(image,delay)(image,delay)...
  213.  
  214. The Anim instruction cycles an object through a sequence of images,
  215. producing a smotth animation effect. "n" is the number of times the
  216. animation cycle is to be repeated. A value of zero for this parameter
  217. will perform the animation continuously.
  218.  
  219.   "image" sprcifies the number of an image to be used for each frame of
  220. your animation. "delay" determines the length of time this image is to
  221. be displayed on the screen, measured in units of a 50th of a second.
  222. Example:
  223.  
  224.         Load "AMOS_DATA:Sprites/Monkey_right.abk" : Get Sprite Palette
  225.         Sprite 9,150,50,11
  226.         M$="Anim 12, (1,4)(2,4)(3,4)(4,4)(5,4)(6,4) ;"                     180
  227.         M$=M$+"Move 300,150,150 ; Move -300,-150,75"
  228.         Amal 9,M$
  229.         Amal On 9
  230.         Direct
  231.  
  232. This program combines a sprite movement with an animation. Notice how
  233. we've separated the commands with a semi-colon. This ensures that the
  234. two operations are totally independent of each other. Once the
  235. animation sequence has been defined, AMAL will immediatly jump to the
  236. next instruction, and the animation will begin.
  237.  
  238.   It's important to realize that Anim only works in conjunction with
  239. sprites and bobs. So it's not possible to animate entire screen with
  240. this command.
  241.  
  242.  
  243. Simple Loops
  244. ------------
  245.  
  246.  
  247.                    Jump (redirects an AMAL program)
  248.                    -
  249. J label
  250.  
  251. Jump provides a simple way of moving from one part of an AMAL program
  252. to another. "label" is the target of your jump, and must have been
  253. defined elsewhere in your current program. All AMAL labels are defined
  254. using a single uppercase followed by a colon. like instructions, you
  255. can pad them out with lower case to improve readability.
  256.  
  257.   Remember that each label is deinfed using just a *single* letter. So
  258. "S:" and "Swoop:" refer to the same label! If you attempt to define two
  259. labels starting with an identical letter, you'll be presented with a
  260. "label already defined in animation string" error.
  261.  
  262.         Each AMAL program can have its own unique set of labels. It's
  263. perfectly acceptable to use the identical labels in several different
  264. programs. Example:
  265.  
  266.        Load "AMOS_DATA:Sprites/Octopus.abk"
  267.        Get Sprite Palette
  268.        For S=8 to 20 Step 2 : Rem Set up 7 computed sprites
  269.         Sprite S,200,(S-7)*13+40,1
  270.        Next S
  271.        Rem : Now let's create seven AMAL programs
  272.        For S=1 to 7
  273.         Channel S To Sprite 6+(S*2)
  274.         M$="Anim 0,(1,2)(2,2)(3,2)(4,2) ; Label: Move "+Str$(S*2)"+,0,7 ;"
  275.         Amal S,M$
  276.        Next S
  277.        Rem Okay, now animate it all!
  278.        Amal On : Direct
  279.  
  280. Since AMAL commands are performed using interrupts, infinite lopos         181
  281. could be disasterous. So a special counter is automatically kept of the
  282. number of jumps in your program. When the counter exceeds ten, any
  283. further jumps will be totally ignored by the AMAL system. 
  284.  
  285.   NOTE: if you rely on this system, and allow your programs to loop
  286. continually, uou'll waste a great deal of the Amiga's computer power.
  287. In practice, it's much more effecient to limit yourself to just a
  288. single jump per VBL. This can be achieved by adding a simple PAUSE
  289. comand before each Jump in your program. See PAUSE for more details.
  290.  
  291.  
  292. Variables and expressions
  293. -------------------------
  294.  
  295.  
  296.                   Let (assigns a value to a register)
  297.                   -
  298. L register=expression
  299.  
  300. The L instruction assigns a value to an AMAL register. The action is
  301. very similar to normal Basic, except that all expressions are evaluated
  302. strictly from left to right.
  303.  
  304.   Registers are integer variables used to hold the intermediate values
  305. in your AMAL programs. Allowable numbers range between -32768 to +32768.
  306. There are three basic types of register:
  307.  
  308.   Internal registers
  309.   - - - - - - - - - 
  310.   Every AMAL program has its own set of 10 internal registers. The
  311.   names of these registers start with the letter R, followed by one of
  312.   the digits from 0 to 9 (R0-R9). Internal registers are like the local
  313.   variables inside an AMOS Basic procedure.
  314.  
  315.   External registers
  316.   - - - - - - - - - 
  317.   Ecternal registers are rather different because they retain their
  318.   values between separate AMAL programs. This allows you to use these
  319.   registers to pass information between several AMAL routines. AMAL
  320.   provides you with up to 26 external registers, with names ranging
  321.   from RA to RZ. The contents of any internal or external register can
  322.   be accessed directly from your Basic program using the AMREG function.
  323.  
  324.   Special registers                                                        182
  325.   - - - - - - - - -
  326.   Special registers are a set of three values which determine the
  327.   status of your object. X,Y contain the coordinates of your object. By
  328.   changing these registers you can move your object around on the
  329.   screen. Example:
  330.  
  331.         Load "AMOS_DATA:Sprites/Frog_Sprites.abk" : Channel 1 To Bob 1
  332.         Flash Off : Get Sprite Palette : Bob 1,0,0,1
  333.         Amal 1,"Loop: Let X=X+1 ; Let Y=Y+1; Pause; Jump Loop"
  334.         Amal On 1 : Direct
  335.  
  336. "A" stores the number of the image which is displayed by a sprite or
  337. bob. You can alter this value to generate your own animation sequences
  338. like so:
  339.  
  340.         Load "AMOS_DATA:Sprites/Frog_Sprites.abk" : Get Sprite Palette
  341.         Flash Off : Channel 2 To Bob 1 : Bob 1,300,100,1
  342.         M$="Loop: Let A=A+1 ; "
  343.         M$=M$+"For R0=1 To 5 ; Next R0 ; Jump Loop"
  344.         Amal 2,M$
  345.         Amal On 2 : Direct
  346.  
  347. The For To Next lop will be explained in more detail below. It is used
  348. here to slow down each change to Bob 1's image. When the "Next" of the
  349. loop is executed, AMAL won't continue until a vertical blank has
  350. occurred. Also note the use of ";" to separate the AMAL instructions -
  351. although a space " " will serve just as well.
  352.  
  353.  
  354. Operators
  355. ---------
  356. AMAL expressions can include all the normal arithmetic operations,
  357. except MOD. You can also use the following logical operatoins in your
  358. calculations:
  359.  
  360.         &       Logical AND
  361.         |       Logical OR
  362.  
  363. Note that it's not possible to change the order of evaluation using
  364. brackets "()" as this would slow down your calculations considerably
  365. and thus reduce the allowable time in the interrupt. Type the following
  366. example:
  367.  
  368.         Load "AMOS_DATA:Sprites/Octopus.abk" : Hide
  369.         Get Sprite Palette
  370.         Sprite 8,X Mouse,Y Mouse,1
  371.         Amal 8,"Loop: Let X=XM ; Let Y=YM ; Pause ; Jump Loop"
  372.         Amal On 8
  373.  
  374.         Load "AMOS_DATA:Sprites/Octopus.abk" : Hide
  375.         Get Sprite Palette
  376.         Sprite 8,X Mouse,Y Mouse,1
  377.         Amal 8,"Anim 0,(1,4)(2,4)(3,4)(4,4) ; Loop: Let X=XM ; Let
  378.                                           Y=YM ; Pause ; Jump Loop"
  379.         Amal On
  380.  
  381. The above examples effectively mimic the CHANGE MOUSE command. However
  382. this system is much more powerful as you can easily move bobs, computed
  383. sprites, or even screens using exactly the same technique.
  384.  
  385.  
  386. Making decisions                                                           183
  387. ----------------
  388.  
  389.  
  390.                    If (branch within an AMAL string)
  391.  
  392. If test Jump L
  393.  
  394. This instruction allows you to perform simple tests in your AMAL
  395. programs. If the expression test is -1 (true) the program will jump to
  396. label L, otherwise AMAL will immediately progress to the next
  397. instruction. Note that unlike it's equivalent, you're limited to a
  398. single jump operation after the test.
  399.  
  400.   It's common practice to pad out this instruction with lowercase
  401. commands like "then" or "else". This makes the action of the command
  402. rather more obvious. Here's an example:
  403.  
  404.         If X>100 then Jump Label else Let X=X+1
  405.         -             -    -          -  
  406. "test" can be any logical expression you like, and may include:
  407.  
  408.         <>  Not equals
  409.         <   Less than
  410.         >   Greater than
  411.         =   Equals
  412.  
  413. Example:
  414.  
  415.         Load "AMOS_DATA:Sprits/Octopus.abk"
  416.         Get Sprite Palette
  417.         Sprite 8,130,50,1
  418.         C$="Main: If XM>100 Jump Test: "
  419.         C$=C$+"Let X=XM "
  420.         C$=C$+"Test: If YM>100 Jump Main "
  421.         C$=C$+"Let Y=YM Jump Main"
  422.         Amal 8,C$ : Amal On : Direct
  423.  
  424. WARNING! Don't try to combine several tests into a single AMAL
  425. expression using "&" or "|". Since expressions are evaluated from left
  426. to right, this will generate an error. Take the expression:
  427. X>100|Y>100. This is intended to check whether X>100 OR Y>100. In
  428. practice, the expression will be evaluated in the following order:
  429.  
  430.         X>100   May be TRUE or FALSE                                       184
  431.         |Y      OR result with Y
  432.         >100    Check if (Y>100|Y)>100)
  433.  
  434. The result from the above expression will obviously be no relation to
  435. the expected value. Technically-minded users can avoid this problem by
  436. using boolean algebra. First assign each test to an single AMAL
  437. register like so:
  438.  
  439.         Let R0=X>100; Let R1=Y>100
  440.  
  441. Now combine these tests into a single expression using | and & and use
  442. it directly in your If statement.
  443.  
  444.         If R0 | R1 Jump L ...
  445.  
  446. This may look a little crazy, but it works beautifully in practice.
  447.  
  448.  
  449.                     For To Next (loop within AMAL)
  450.                     -   -  -
  451. For reg=start To end
  452.   :   :
  453. Next reg                      This implements a standard FOR...NEXT
  454.                               loop which is almost identical to its
  455. Basic equivalent. These loops can be exploited in your programs to move
  456. objects in complex visual patterns. "reg" may be any normal AMAL
  457. register (R0-R9 or RA-RZ). However you can't use special registers for
  458. this purpose.
  459.  
  460.   As with Basic, the register after the Next must match with the
  461. counter you specified in the For, otherwise you'll get an AMAL syntax
  462. error. Also note that the step size is always set to one. Additionally,
  463. it's possible to "nest" any number of loops inside each other.
  464.  
  465.   Note that each animation channel will only perform a single loop per
  466. VBL. This synchronizes the effects of your loops with the screen
  467. display, and avoids the need to add an explicit Pause command before
  468. each Next.
  469.  
  470.  
  471. Generating an attack wave for a game
  472. ------------------------------------
  473. These lopos can be used to create some quite complex movement patterns.
  474. The easiest type of motion is in a straight line. This can be generated
  475. using a single For...Next loop like so:
  476.  
  477.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  478.         Sprite 8,130,60,1
  479.         C$=For R0=1 To 320 ; Let X=X+1 ; Next R0" : Rem Move sprite
  480.         Amal 8,C$ : Amal On 8 : Direct
  481.  
  482. You can now expand this program to sweep the object back and forth
  483. across the screen.
  484.  
  485.         Load "AMOS_SATA:Sprites/Octopus.abk" : Get Sprite Palette
  486.         Sprite 8,130,60,1
  487.         C$="Loop: For R0=1 To 320 ; Let X=X+1 ; Next R0 ;"                 185
  488.         C$=C$+" For R0=1 To 320 ; Let X=X-1 ; Next R0 ; Jump Loop"
  489.         Amal 8,C$ : Amal On 8 : Direct
  490.  
  491. The first loop moves the object from left to right, and the second from
  492. right to left. So far the pattern has been restricted to just
  493. horizontal movements. In order to create a realistic attack wave, it's
  494. necessary to incorporate a vertical component to this motion as well.
  495. This can be achieved by enclosing your program with yet another loop.
  496.  
  497.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  498.         Sprite 8,130,60,1 : C$=For R1=0 To 10 ;"
  499.         C$=C$+"For R0=1 To 320 ; Let X=X+1 ; Next R0 ; "
  500.         C$=C$+"Let Y=Y+8 ; "
  501.         C$=C$+"For R0=1 To 320 ; Let X=X-1 ; Next R0 ; "
  502.         C$=C$+"Let Y=Y+8 ; Next R1"
  503.         Amal 8,C$ : Amal On 8
  504.  
  505. The above programs generates a smooth but quite basic attack pattern. A
  506. further demonstration can be found in EXAMPLE 14.1 in the MANUAL
  507. folder.
  508.  
  509.  
  510. Recording a complex movement sequence
  511. -------------------------------------
  512.  
  513.  
  514.                                  PLay
  515.                                  --
  516. PLay path
  517.  
  518. If you've looked at the smooth attack waves in a modern arcade game,
  519. and thought them forever beyond your reach, think again. The AMAL Play
  520. command allows you freely animate your objects through practically any
  521. sequence of movements you can imagine. It works by playing a previously
  522. defined movement pattern stored in the AMAL memory bank.
  523.  
  524.   These patterns are created from the AMAL accessory on the AMOS
  525. program disc. This simply records a sequence of mouse movements and
  526. enters them directly into the amal memory bank. Once you've created
  527. your patterns in this way, you can effortlessly assign them to any
  528. object on the screen, reproducing your original patterns perfectly.
  529. Both the speed and direction of your movement can be changed at any
  530. time from your AMOS Basic program.
  531.  
  532.   The first time AMAL encounters a Play command, it checks the AMAL
  533. bank to find the recorded movement you specified using the "path"
  534. parameter. "path" is simply a number ranging from one to the maximum
  535. number of patterns in the bank. If a problem crops up during this
  536. phase, AMAL will abort the play instruction completely, and will skip
  537. to the next instruction in your animation string.
  538.  
  539.   After the pattern has been initialised, register R0 will be loaded
  540. with the tempo of the movement. This determines the time interval
  541. between each individual movement step. All timings are measured in
  542. units of a 50th of a second. By changing this register within your AMAL
  543. program, you can speed up or slow down your object movements
  544. accordingly.
  545.  
  546.   Note that each movement step is *added* to the current coordinates of
  547. your object. So if an object is subsequently moved using the Sprite or
  548. Bob instructions, it will continue its manoeuvres unaffected, starting
  549. from the new screen position. It's therefore possible to animate dozens
  550. of different objects on the screen using a single sequence of
  551. movements. 
  552.  
  553.   Register R1 now contains the flag which sets the direction of your       186
  554. movements. There are three possible situations:
  555.  
  556.     *  R1>0   Forward
  557.  
  558. A value of one for R1 specifies that the movement pattern will be
  559. replayed from start to finish, in exactly the order it was created
  560. (this is the default).
  561.  
  562.     *  R1=0   Backward
  563.  
  564. Many animation sequences require your objects to move back and forth
  565. across the screen in a complex pattern. To change direction, simply
  566. load R1 with a zero. Your object will now turn around and execute your
  567. original movement steps in reverse.
  568.  
  569.     *  R1=-1  Exit
  570.  
  571. If a collision has been detected from your AMOS program, you'll need to
  572. stop your object completely, and generate an explosion effect. This can
  573. be accomplished by setting R1 to a value of minus one. AMAL will now
  574. abort the play instruction, and immediately jump to the next
  575. instruction in your animation sequence.
  576.  
  577.   The clever thing about these registers is that they can be changed
  578. directly from AMOS Basic. This lets you control your movement patterns
  579. directly from within your main program. There's even a special AMPLAY
  580. instruction to make things easier for you.
  581.  
  582.   The PLay comand is perfect for controlling the aliens in an arcade
  583. game. In fact, it's the single most powerful instruction in AMAL.
  584.  
  585.  
  586.  
  587.                       AMAL (call an AMAL program)
  588.  
  589. AMAL n,a$
  590. AMAL n,p
  591. AMAL n,a$ to address          The AMAL command assigns an AMAL program
  592.                               to an animation channel. This program can
  593.     be taken either from a string in a$ or directly from the AMAL bank. 
  594.  
  595.   The first version of the instruction loads your program from the
  596. string a$ and assigns it to channel n. a$ can contain any list of AMAL
  597. instructions. Alternatively you can load your program from a memory
  598. bank stored in bank number 4.
  599.  
  600.   n is the number of an animation channel ranging from 0 to 63. Each
  601. AMOS channel can be independently assigned to either a bob, a sprite or
  602. a screen.
  603.  
  604.   Only the first 16 AMAL programs can be performed using interrupts. In
  605. order to exceed this limit you need execute your programs directly from
  606. Basic using the SYNCHRO command.
  607.  
  608.   The final version of the AMAL insturction is provided for advanced
  609. users. Instead of moving an actual object, this simply copies the
  610. contents of registers X,Y and A into a specific area of memory. You can
  611. now use this information directly in your own Basic routines. It's         187
  612. therefore possible to exploit the AMAL system to animate anything from
  613. a Block to a character. The format is:
  614.  
  615.         AMAL n,a$ To address
  616.  
  617. "address" must be EVEN and must point to safe region of memory,
  618. preferably in an AMOS string or a memory bank. Every time your AMAL
  619. program is executed (50 times per second), the following values will be
  620. written into this memory area:
  621.  
  622.      Location     Effect
  623.      --------     ------
  624.      Address      Bit 0 is set to 1 if the X has changed
  625.                   Bit 1 indicates that Y has been altered
  626.                   Bit 2 will be set if the image (A) has changed since
  627.                         the last interrupt.
  628.      Address+2    Is a *word* containing the latest value of X
  629.      Address+4    Holds the current value of Y
  630.      Address+6    Stores the value of A
  631.  
  632. These values can be accessed from your program using a simple DEEK. 
  633. NOTE: This option totally overrides any previous CHANNEL assignments.
  634.  
  635.  
  636. AMAL commands             
  637. =============
  638. Here is a full list of the available amal commands:
  639.  
  640. M (Move)        Move deltaX, deltaY, steps
  641. A (Anim)        Anim cycles,(image,delay)(image,delay)...
  642. L (Let)         Let reg=exp                                                188
  643. J (Jump)        Jump L
  644. I (If)          If exp Jump L
  645. For To Next     For Reg=start To end ...Next Reg
  646. PL (PLay)       PLay path                                                  189
  647. P (Pause)       Pause   
  648.  
  649. AU (AUtotest)   AU (list of tests)             See the Autotest System     190
  650.  
  651. X (eXit)        eXit          Exits from an AUtotest and re-enters the
  652.                               current AMAL program.
  653.  
  654. W (Wait)        Wait          Freezes your AMAL program and only
  655.                               executes the AUtotest.
  656.  
  657. O (On)          On            Activates the main program after a Wait.
  658.  
  659. D (Direct)      Direct        Sets the section of the main program
  660.                               to be executed after an autotest.
  661.  
  662. AMAL functions                                                             191
  663. ==============
  664.  
  665. =XM          Returns the X coordinate of the mouse
  666. =YM          Returns the Y coordinate of the mouse 
  667. =K1          Status of left mouse key (-1, if pressed, otherwise 0)
  668. =K2          Status of right mouse key
  669. =J0          Test right joystick. Result in bit-map.
  670. =J1          Test left joystick. See the JOY command.
  671.  
  672. =Z(n)        Random number. Returns a random number between -32767
  673.              to 32768. This number can be limited to a specific
  674.              range using the bit-mask n. A logical AND operation
  675.              is performed between the bit mask n and the random
  676.              number to generate the final result. So setting n to 
  677.              a value of 255 will ensure that the numbers will be
  678.              returned in the range 0 to 255. Since this function has
  679.              been optimized for speed, the number returned isn't
  680.              totally random. If you need really random numbers, you
  681.              would be better to generate your values using Basic's
  682.              RND and then load them into an external AMAL register
  683.              with the AMREG function.
  684.  
  685. =XH(s,x)     Converts a screen x coordinate into a hardware coordinate.    192
  686. =YH(s,y)     Converts a screen y coordinate into hardware format.
  687. =XS(s,x)     Hardware to screen conversion
  688. =YS(s,y)     Hardware to screen conversion
  689.  
  690. =BC(n,s,e)   Check for collisions between bobs. BC is identical to the
  691.              equivalent AMOS Basic BOB COL instruction. It checks bob
  692.              number n for collisions between bobs s to e. If a
  693.              collision has been detected, then BC will return a value
  694.              of -1, otherwise 0. This instruction may NOT be performed
  695.              within an iterrupt. So it's only available when you are
  696.              executing your AMAL routines directly from Basic with the
  697.              SYNCHRO instruction.
  698.  
  699. =SC(n,s,e)   This is equivalent to the SPRITE COL function. Like BC
  700.              function, it's only allows in conjuction with the SYNCHRO
  701.              instruction.
  702.  
  703. =V(v)        VU-meter. The VU function samples one of the sound
  704.              channels and returns the intensity of the current voice.
  705.              This is a number in the range 0-255. You can use this
  706.              information to animate your objects in time to the music.
  707.              An example of this can be found in EXAMPLE 14.3. Also see
  708.              the VUMETER function from AMOS Basic
  709.  
  710.  
  711. Controlling AMAL from Basic                                                193
  712. ===========================
  713.  
  714.  
  715.                AMAL ON/OFF (start/stop an AMAL program)
  716.  
  717. AMAL ON [n]
  718.  
  719. Once you've defined your AMAL program you need to execute it using the
  720. AMAL ON command. This activates the AMAL system and starts your
  721. programs from the first instruction. 
  722.  
  723.   AMAL ON activates all your programs. The optional parameter n allows
  724. you start just one routine at a time.
  725.  
  726.         AMAL OFF [n]
  727.  
  728. Stops one or all AMAL programs from executing. These programs are
  729. erased from meomry. They can only be restarted by redefining them again
  730. using the AMAL instruction.
  731.  
  732.  
  733.  
  734.                     AMAL FREEZE (temporarily freeze
  735.                            an amal program)
  736. AMAL FREEZE [n]
  737.  
  738. Stops one or more AMAL programs for running. Your programs can be
  739. restarted at any time using a simple call to AMAL ON. Note that this
  740. instruction should always be used to stop AMAL before a command such as
  741. DIR is executed, otherwise problems with timing can cause visual
  742. mishaps.
  743.  
  744.  
  745.  
  746.                      =AMREG= (get the value of an
  747.                         external AMAL register)
  748.  
  749. r=AMGER(n, [channel])
  750. AMREG(n, [channel])=expression
  751.  
  752. The AMREG function allows you to access the contents of internal and
  753. external AMAL register directly from within your Basic program.
  754.  
  755.   "n" is the number of the register. Possible values range from 0 to 25
  756. with zero representing register RA and twenty-five denoting RZ.
  757.  
  758.   By using the optional "channel" parameter you can reference any AMAL
  759. internal register. In this mode "n" ranges between 0 and 9 representing
  760. R0 to R9.
  761.  
  762.   The following examples shows how it is possible to retrieve a
  763. sprite's current X-position from Basic:
  764.  
  765.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  766.         Channel 1 To Sprite 8 : Sprite 8,100,100,1
  767.         A$="Loop: Let RX=X+1; Let X=RX; Pause; Jump Loop"
  768.         Amal 1,A$ : Amal On : Curs Off
  769.         Do
  770.           Locate 0,0
  771.           Z=Asc("X")-65 : Rem Note the use of ASC to get the register #
  772.           Print Amreg(Asc("X")-65)
  773.         Loop
  774.  
  775.  
  776.  
  777.                      AMPLAY (control an animation                          194
  778.                           produced with PLay)
  779.  
  780. AMPLAY tempo,direction [start TO end])
  781.  
  782. Any movement sequences you've produced using the AMAL PL command are
  783. controlled through the internal registers R0 and R1. Each object will
  784. be assigned it's own unique set of AMAL registers. So if you're
  785. animating several objects, you'll often need to load a number of these
  786. registers with exactly the same values.
  787.  
  788.   Although this can be achieved using the standard AMREG function, it
  789. would obviously be much easier if there was a single instruction which
  790. allowed you to change R0 and R1 for a whole batch of objects at a time.
  791. That's the purpose of the AMPLAY command.
  792.  
  793.   AMPLAY takes the "tempo" and "direction" of your movements, and loads
  794. them into the registers R0 and R1 in the selected channels.
  795.  
  796.   "tempo" controls the speed of your object on the screen. It sets a
  797. delay (in 50ths of a second) between each successive movement step.
  798.  
  799.   "direction" changes the direction of the motion. Here's a list of the
  800. various different options.:
  801.  
  802.      Value Direction
  803.      ----- ---------
  804.       >0   Move the selected object in the original movement direction.
  805.        0   Reverses the motion and moves the object backwards
  806.       -1   Aborts movement pattern and jumps to the following
  807.            instruction in your AMAL animation sequence.
  808.  
  809. As a default, this instruction will affect all current animation
  810. channels. This can be changed by adding some explicit "start" and "end"
  811. points to the command. "start" is the channel number of the first
  812. object to be adjusted. "end" holds the channel number assigned to the
  813. last object in your list. Note that either the "tempo" or the
  814. "direction" can be omitted as required. Examples:
  815.  
  816.         Amplay ,0         : Rem reverse your objects
  817.         Amplay 2,         : Rem Slow down your movement patterns
  818.         Amplay ,-1 3 To 6 : Rem stop movements on channels 3,4,5 and 6.
  819.  
  820.  
  821.  
  822.                      =CHANAN (test AMAL animation)                         195
  823.  
  824. s=CHANAN(channel)
  825.  
  826. This is a simple function which checks the status of an AMAL animation
  827. sequence and returns -1 (true) if it's currently active or 0 if the
  828. animation is complete. "channel" holds the number of the channel to be
  829. tested.
  830.  
  831.  
  832.  
  833.                    =CHANMV (checks whether an object
  834.                            is still moving)
  835. s=CHANMV(channel)
  836.  
  837. Returns a value of -1 if the object assigned to "channel" is currently
  838. moving, otherwise 0 (false).
  839.  
  840.   This command can be used in conjunction with the AMAL Move
  841. instruction to check whether a movement sequence has "run out" of
  842. steps. You can now restart the sequence at the new position with an
  843. appropriate movement string if required. Example:
  844.  
  845.         Load "AMOS_DATA:Sprites/Monkey_right.abk" : Get Sprite Palette
  846.         Sprite 9,150,50,11
  847.         M$=Move 300,150,150; Move -300,-150,75"
  848.         Amal 9,M$ : Amal On
  849.         While Chanmv(9)
  850.         Wend
  851.         Print "Movement complete"
  852.  
  853.  
  854.  
  855. AMAL errors
  856. ===========
  857.  
  858.  
  859.               =AMALERR (return the position of an error)
  860.  
  861. p=AMALERR
  862.  
  863. Returns the position in the current animation string where an error has
  864. occurred. Careful inspection of this string will allow you to quickly
  865. correct your mistakes. Example:
  866.  
  867.         Load "AMOS_DATA:Sprites/Octopus.abk"
  868.         Sprite 8,100,100,1
  869.         A$="L: IF X=300 then Jump L else X=X+1; Jump L"
  870.         Amal 8,A$
  871.  
  872. This program will generate a syntax error because IF will be
  873. interpreted as the two instructions I and F. To find the position in
  874. the animation string of this error, type the following instruction from
  875. the direct window.
  876.  
  877.         Print Mid$(A$,Amalerr,Amaller+5)
  878.  
  879.  
  880. Error messages                                                             196
  881. --------------
  882. If you make a mistake in one of your AMAL programs, AMOS will exit back
  883. to Basic with an appropriate error message. Here's a full list of the
  884. errors which can be generated by this system, along with an explanation
  885. of their most likely causes.
  886.  
  887.  Bank not reserved: This error is caused if you attempt to call the
  888.                     PLay instruction without first loading a bank
  889.          containing the movement data into memory. This should be
  890.          created with the AMAL accessory program. If you're not using
  891.          PLay at all then check that you've correctly separated any
  892.          Pause and Let instructions.
  893.  
  894.  Insturction only valid in Autotest: You've inadvertently called either
  895.                                      the Direct or the eXit
  896.          instructions from your main AMAL program.
  897.  
  898.  Illegal instruction in Autotest: Autotest may only be used in
  899.                                   conjunction with a limited range of 
  900.          AMAL commands. It's not possible to move or animate our
  901.          objects in any way inside an autotest. So check for erroneous
  902.          commands like Move, Anim or For...Next.
  903.  
  904.  Jump To/Within Autotest in animation string: The commands inside an
  905.                                               autotest function are
  906.          completely separate from your main AMAL program. So AMAL does
  907.          not allow you to jump directly inside an AUtotest procedure. 
  908.          To leave an autotest, and return to your main AMAL program you
  909.          must use either eXit or Direct.
  910.  
  911.  Label already defined in animation string: You've attempted to define
  912.                                             the same label twice in
  913.          your AMAL program. All AMAL labels consist of just a single
  914.          CAPITAL letter. So "Test" and "Total" are just different 
  915.          versions of the same label (T). This error is also generated
  916.          if you have accidentally separated two instructions by a ":"
  917.          (colon). Use a semi-colon instead.
  918.  
  919.  Label not defined in animation string: This error is generated when
  920.                                         you try to jump to a label
  921.          which doesn't currently exist in your animation string.
  922.  
  923.  Next without For in animation string: Like it's Basic equivalent each
  924.                                        For command should be matched
  925.          by a corresponding Next statement. Check any nested loops for
  926.          an spurious Next command.
  927.  
  928.  Syntax error in animation string: You've made a typing mistake in one
  929.                                    of your animation strings. It's easy
  930.          to cause this error by accidentally entering an AMAL
  931.          instruction in full, just like its Basic equivalent. 
  932.  
  933.  
  934. Animation channels                                                         197
  935. ==================
  936. Amos allows you to execute up to 64 different AMAL programs
  937. simultaneously. Each program is assigned to a specific animation
  938. channel.
  939.  
  940.   Only the first 16 channels can be performed using interrupts. If you
  941. need to animate more objects you'll have to turn off the interrupts
  942. using SYNCHRO OFF. You can now execute the AMAL programs step by step
  943. using an explicit call to the SYNCHRO command in yur main program loop.
  944. As a default, all interrupt channels are assigned to the relevant
  945. hardware sprite.
  946.  
  947.  
  948.  
  949.              CHANNEL (assign an object to an AMAL channel)
  950.  
  951. CHANNEL n TO object s
  952.  
  953. The CHANNEL command assigns an animation channel to a particular screen
  954. related "object". In AMAL, you're not restricted to a single channel
  955. per object. Any single screen object can be safely animated with
  956. several channels if required. There are various different forms of this
  957. instruction.
  958.  
  959.  
  960. Animating a computed sprite
  961. ---------------------------
  962.  
  963. CHANNEL n TO SPRITE s
  964.  
  965. This assigns sprite number s to channel n. As a default, channels 0-7
  966. are automatically allocated to the equivalent hardware sprite, and 8-15
  967. are reserved for the appropriate computed sprites.
  968.  
  969.   In order to animate the computed sprites from 16 onwards, you'll need
  970. to allocate them directly to an animation channel with the CHANNEL
  971. command. As normal , sprite numbers from 8 to 63 specify a computed
  972. sprite rather than a single hardware sprite. For example;
  973.  
  974.         Channel 5 To Sprite 8 : Rem Animates Computed sprite 8 using
  975.                                     Channel 5.
  976.  
  977. The X,Y  registers in your AMAL program now refer to the hardware
  978. coordinates of the selected sprite. Similarly the current sprite image
  979. is held in register A.
  980.  
  981.  
  982. Animating a blitter object
  983. --------------------------
  984.  
  985. CHANNEL n TO BOB b
  986.  
  987. Allocates blitter object b to animation channel n. This object will be
  988. treated in an identical way to the equivalent hardware sprite. The only
  989. difference is that registers X and Y now contain the position of your
  990. bob in *screen* coordinates.
  991.  
  992.   Note that if you've activated screen switching with the DOUBLE BUFFER
  993. command, this will be automatically used for all bob animations. 
  994.  
  995.  
  996. Moving a screen                                                            198
  997. ---------------
  998. AMOS Basic allows you to freely position the current screen anywhere on
  999. your TV display. Normally this is controlled with the SCREEN DISPLAY
  1000. instruction. However, sometimes it's useful to be able to move the
  1001. screen using interrupts.
  1002.  
  1003. CHANNEL n TO SCREEN DISPLAY d
  1004.  
  1005. This sets the channel n to screen number d. Screen d can be defined
  1006. anywhere in your program. You'll only get an error if the screen hasn't
  1007. been opened when you start your animation.
  1008.  
  1009.   The X and Y variables in AMAL now hold the position of your screen in
  1010. hardware coordinates. Register A is *not* used by this option and you
  1011. can't animate screens using Anim. Otherwise all standard AMAL
  1012. instructions can be performed as normal. So you can easily use this
  1013. system to "bounce" the picture aroud the display. Examples:
  1014.  
  1015.         Load Iff "AMOS_DATA:IFF/Frog_screen.IFF",1
  1016.         Channel 0 To Screen Display 1
  1017.         Amal 0,"Loop: Move 0,200,100 ; Move 0,-200,100 ; Jump Loop"
  1018.         Amal On 0 : Direct
  1019.  
  1020.         Load Iff "AMOS_DATA:IFF/Frog_screen.IFF",1
  1021.         Channel 0 To Screen Display 1
  1022.         Rem Screen can only be displayed at certain positions in the X
  1023.         Amal 0,"Loop: Let X=XM; Let Y=YM; Pause; Jump Loop"
  1024.         Amal On : Direct
  1025.  
  1026. For a further example of this technique, load EXAMPLE 14.4. This
  1027. demonstrates how the SCREEN DISPLAY can be used in conjunction with the
  1028. menu commands to slide the menu screen up and down your display. It's
  1029. similar to the display system found in Magnetic Scrolls' excellent
  1030. series of adventures.
  1031.  
  1032.  
  1033. Hardware scrolling
  1034. ------------------
  1035. Although hardware scrolling can be performed using AMOS Basic's SCREEN
  1036. OFFSET command, it's often easiest to animate your screens using AMAL
  1037. instead as this generates a much smoother effect.
  1038.  
  1039. CHANNEL n TO SCREEN OFFSET d
  1040.  
  1041. This assigns AMAL program number n to a screen d, for the purpose of
  1042. hardware scrolling. The X and Y registers now refer to the section of
  1043. the screen which is to be displayed through your TV. Changing these
  1044. registers will scroll the visible screen area around the display.
  1045. Here's an example:
  1046.  
  1047.         Screen Open 0,320,500,32,lowres : Rem Open an extra tall screen
  1048.         Screen Display 0,,45,320,250
  1049.         Load Iff "AMOS_DATA:IFF/Magic_screen.IFF"
  1050.         Screen copy 0,0,0,320,250 To 0,0,251
  1051.         Screen 0 : Flash Off : Get Palette (0)
  1052.         Channel 0 to Screen Offset 0
  1053.         Amal 0,"Loop: Let X=XM-128; Let Y=YM-45; Pause; Jump Loop"
  1054.         Amal On : Wait Key
  1055.  
  1056. This program allows you to scroll through the screen using the mouse.
  1057. Try moving the mouse in direct mode. For a further example of hardware
  1058. scrolling, see EXAMPLE 14.5
  1059.  
  1060.  
  1061. Changing the screen size                                                   199
  1062. ------------------------
  1063.  
  1064. CHANNEL n TO SCREEN SIZE s
  1065.  
  1066. This allows you to change the size of a screen using AMAL. s is the
  1067. number of the screen to be manipulated. Registers X and Y now control
  1068. the width and height of your screen respectively. They're similar to
  1069. the W and H parameters used by the SCREEN DISPLAY command. Example:
  1070.  
  1071.         Load Iff "AMOS_DATA:IFF/Magic_screen.IFF",0
  1072.         Channel 0 to Screen Size 0
  1073.         Screen display 0,,,320,1 : Rem set the screen size to 1
  1074.         A$=Loop: For R0=0 To 255 ; Let Y=R0 ; Next R0; "
  1075.         A$=A$+"For R0=0 To 254; Let Y=255-R0; Next R0; J Loop"
  1076.         Amal 0,A$ : Amal On : Direct
  1077.  
  1078.  
  1079. Rainbows
  1080. --------
  1081.  
  1082. CHANNEL n TO RAINBOW r
  1083.  
  1084. This option generates a rainbow effect within an AMAL program. As usual
  1085. n is the number of an animation channel from 0 to 63. r is an
  1086. identification number of your rainbow (0-3).
  1087.  
  1088.   X holds the current BASE of your rainbow. This is the first colour of
  1089. your rainbow palette to be displayed. Changing it will make the rainbow
  1090. appear to turn. Y contains the line on the screen at which the rainbow
  1091. effect will start. If you alter this value, the rainbow effect will
  1092. move up or down. All coordinates are measured in *hardware* format.
  1093.  
  1094.   Register A stores the height of your rainbow on the screen. See the
  1095. AMOS Basic RAINBOW command fore more details.
  1096.  
  1097.  
  1098. Advanced tehcniques
  1099. ===================
  1100.  
  1101. The AUTOTEST system
  1102. -------------------
  1103. Normally all AMAL programs are performed in strict order from start to
  1104. finish. Inevitably some commands such as Move and For...Next will take
  1105. several seconds to complete. Although this will be fine in the vast
  1106. majority of cases it may lead to significant delays in the running of
  1107. certain programs. Take the following simple program:
  1108.  
  1109.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  1110.         Sprite 8,130,50,1
  1111.         Amal 8,"Loop: Let R0=XM-X; Let R1=YM-Y; Move R0,R1,50; Jump Loop"
  1112.         Amal On : Direct
  1113.  
  1114. As you move the mouse, the sprite is supposed to follow it around on
  1115. the screen. However in practice the response time is quite sluggish,
  1116. because the new values of XM and YM are only entered after the sprite
  1117. movement has totally finished. Try moving the mouse in a circle. The
  1118. octopus is completely fooled!
  1119.  
  1120.   Autotest solves this problem by performing your tests at the start of
  1121. every VBL, before continuing with the current program. You tests now
  1122. occur at regular 1/50 intervals, leading to a practically instantanous
  1123. response!
  1124.  
  1125.  
  1126. Autotest commands                                                          200
  1127. -----------------
  1128. The syntax of Autotest is:
  1129.  
  1130. AUtotest (tests)
  1131. -- 
  1132.     "tests" can consist of any of the following AMAL commands.
  1133.  
  1134. Let reg=exp
  1135. -
  1136.     This is the standard AMAL Let instruction. It assigns the result
  1137.     of an expression to register "reg".
  1138.  
  1139. Jump label
  1140. -
  1141.     The Jump command jumps to another part of the current autotest.
  1142.     "label" is defined using the colon ":" and *MUST* lie inside the 
  1143.     autotest brackets.
  1144.  
  1145. eXit
  1146.  -
  1147.     Leaves the autotest and re-enters the main program from the point
  1148.     it left off.
  1149.  
  1150. Wait
  1151. -
  1152.     Wait turns off the main AMAL program completely, and only executes
  1153.     the Autotest.
  1154.  
  1155. If
  1156. -
  1157.     In order to simplify the testing process inside an autotest routine
  1158.     there's a specially extended version of the AMAL If statement. This
  1159.     allows you to perform one of three actions depending on the result
  1160.     of the logical expression "exp".
  1161.  
  1162.     If exp Jump L   (Jumps to another part of the autotest)
  1163.     If exp Direct L (Chooses part of the prog to be executed after AU)     201
  1164.     If exp eXit     (Leaves autotest)
  1165.  
  1166. On
  1167. -
  1168.     Restarts the main program after a previous Wait instruction. This
  1169.     lets you wait for a specific event such as a mouse click without
  1170.     wasting processor time.
  1171.  
  1172. Direct label
  1173. -
  1174.     Direct changes the point at which the main program will be resumed
  1175.     after your test. AMAL will now jump to this point automatically at 
  1176.     the next vertical blank period. Note that label *must* be defined
  1177.     outside the Autotest brackets.
  1178.  
  1179.  
  1180. Inside Autotest
  1181. ---------------
  1182. Here's the previous example rewritten using the Autotest feature
  1183.  
  1184.         Load "AMOS_DATA:Sprites/octopus.abk"
  1185.         Sprite 8,130,50,1 : Get Sprite Palette
  1186.         A$="AUtotest (If R0<>XM Jump Update"
  1187.         A$=A$+"If R1<>YM Jump Update else eXit"
  1188.         A$=A$+"Update: Let R0=XM; Let R1=YM; Direct M)" : Rem End of AU
  1189.         A$=A$+"M: Move R0-X,R1-Y,20 Wait;" : Rem Try changing 20 to
  1190.                                                  different values!
  1191.         Amal 8,A$ : Amal On
  1192.  
  1193. The sprite now smoothly follows your mouse, no matter how fast you move
  1194. it. The action of this program is as follows:
  1195.  
  1196.   Every 50th of a sec the mouse coordinates are tested using the XM and
  1197. YM functions. If they are unchanged since the last test, the Autotest
  1198. is aborted using the eXit command. The main program now resumes
  1199. precisely where it left off.
  1200.  
  1201.   However if the mouse has been moved, the autotest routine will
  1202. restart the main program again from the beginning (label M) using the
  1203. new coordinates in XM and YM respectively.
  1204.  
  1205.  
  1206. Timing considerations
  1207. ---------------------
  1208.  
  1209.  
  1210.                    UPDATE EVERY (save some time for
  1211.                          your Basic programs)
  1212. UPDATE EVERY n
  1213.  
  1214. Although most AMAL programs are performed practically instantaneously,
  1215. any objects they manipulate need to be explicity drawn on the Amiga's
  1216. screen. 
  1217.  
  1218.   The amount of time required for this updating procedure is
  1219. unpredictable and can vary during the course or your program. This can
  1220. lead to an annoying jitter in the movement patterns of certain objects.
  1221.  
  1222.   The UPDATE EVERY command slows down the updating process so that even
  1223. the largest object can be redrawn during a single screen update. This
  1224. regulates the animation system and generates delightfully smooth
  1225. movement effects.
  1226.  
  1227.   n is the number of vertical blank periods between each screen update.
  1228. In practice you should start off with a value of two, and gradually
  1229. increase it until movement is smooth.
  1230.  
  1231.   One useful side effect of UPDATE EVERY, is to reserve more time for
  1232. Basic to execute your programs. With a judicious use of this
  1233. instruction, it's sometimes possible to speed up your programs by as
  1234. much as 30%, without destroying the smoothness of your animation
  1235. sequences.
  1236.  
  1237.  
  1238. Beating the 16 object limit                                                202
  1239. ---------------------------
  1240.  
  1241.  
  1242.               SYNCHRO (execute an AMAL program directly)
  1243.  
  1244. SYNCHRO [ON/OFF]
  1245.  
  1246. Normally AMOS Basic will allow you to execute up to 16 different AMAL
  1247. programs at a time. This limit is determined by the overall speed of
  1248. the Amiga's hardware. Each AMAL program takes its own slice of the
  1249. available processor time. So if you're using the standard interrupt
  1250. system, there's only enough time to execute around 16 separate
  1251. programs.
  1252.  
  1253.   The SYNCHRO command allows you to exceed this restriction by
  1254. executing your AMAL programs directly from Basic. Instead of using
  1255. interrupts, all AMAL programs are now run using a single call to the
  1256. SYNCHRO command. Since AMAL programs execute far faster than the
  1257. equivalent Basic routines, your animations will still be delightfully
  1258. smooth. But you will now able to decide when and where yur AMAL
  1259. routines will be performed in your program.
  1260.  
  1261.   One additional bonus is that you can now include collision detection
  1262. commands such as Bob Col or Sprite Col directly in your AMAL routines.
  1263. These are not available from the interrupt system as they make use of
  1264. the Amiga's blitter chip. This would be impossible using iterrupts.
  1265.  
  1266.   Before calling SYNCHRO you first need to turn off the interrupts with
  1267. SYNCHRO OFF. It's imporatnt to do this *before* defining your AMAL
  1268. programs, otherwise you won't be allowed to use channel numbers greater
  1269. than 15 without an error.
  1270.  
  1271.   Due of the sheer power of the animation system, it's nearly possible
  1272. to write entire arcade games completely in AMAL. This leaves your Basic
  1273. program with simple jobs such as managing the hi-score table and
  1274. loading your attack waves from the disc. The results will be
  1275. indistinguishable from pure machine code. A good example is Cartoon
  1276. Capers, the first commercial games release that's written entirely in
  1277. AMOS.
  1278.  
  1279.   A demonstration of SYNCHRO can be found in EXAMPLE 14.6.
  1280.  
  1281.  
  1282. STOS compatible animation commands
  1283. ----------------------------------
  1284. The original STOS Basic included a powerful animation system which
  1285. allowed you to move your sprites in quite complex patterns using
  1286. interrupts. At the time, these commands were hailed as a breakthrough.
  1287.  
  1288.   Although they've now been overshadowed by the AMAL system, they do       203
  1289. provide a simple introduction to animation on the Amiga. So AMOS
  1290. provides you with the entire STOS animation system as an extra bonus!
  1291.  
  1292.   If you're indenting to convert STOS programs to AMOS, you'll need to
  1293. note the following points:
  1294.  
  1295.   * Unlike STOS, the movement patterns in AMOS Basic can be assigned to
  1296.     any animation channel you like. The Move commands can therefore be
  1297.     used to move bobs, sprites or screens, using exactly the same
  1298.     techniques.
  1299.  
  1300.       As a default, all animation channels are assigned to the
  1301.     equivalent hardware sprites. In practice you may find it easier to
  1302.     substitute blitter objects as these are much close to the standard
  1303.     STOS Basic sprites. Add a sequence of CHANNEL commands to start of
  1304.     your program like so:
  1305.  
  1306.         Channel 1 to bob 1
  1307.         Channel 2 to bob 2
  1308.           :        :
  1309.  
  1310.     Don't forget to call DOUBLE BUFFER during your initialisation
  1311.     procedure, otherwise your bobs will flicker annoyingly when they're
  1312.     moved.
  1313.  
  1314.   * The same channel can be used for both STOS animations and AMAL
  1315.     programs. So it's easy to extend your programs once they've been
  1316.     succesfully converted into AMOS Basic. The order of execution is:
  1317.  
  1318.     AMAL
  1319.     MOVE X
  1320.     MOVE Y
  1321.     ANIM
  1322.  
  1323.  
  1324.                   MOVE X (move a sprite horizontally)
  1325.  
  1326. MOVE X n,m$
  1327.  
  1328. Defines a list of horizontal movements which will be subsequently
  1329. performed on animation channel number n.
  1330.  
  1331.   n can range from 0 to 15 and refers to an object you have previously
  1332. assigned using the CHANNEL command. m$ contains a sequence of
  1333. instructions which together determine both the speed and direction of
  1334. your object. These commands are enclosed between brackets and are
  1335. entered using the following format:
  1336.  
  1337.         (speed,step,count)
  1338.  
  1339. There's no limit to the number of commands you can include in a single
  1340. movement string, other than the amount of available memory.
  1341.  
  1342.   "speed" sets a delay in 50ths of a second between each successive
  1343. movement step. The speed can vary from 1 (very fast) to 32767
  1344. (incredibly slow).
  1345.  
  1346.   "step" specifies the number of pixels the object will be moved during
  1347. each operation. If the step is positive the sprite will move to the        204
  1348. right, and if it is negative it will move left. 
  1349.  
  1350.   The apparent speed of the object depends on a combination of the
  1351. speed and step size. Large displacements coupled with a moderate speed
  1352. will move the object quickly but jerkily across the screen. Similarly a
  1353. small step size combined with a high speed will also move the object
  1354. rapidly, but the motion will be much smoother. The fastest speeds can
  1355. be obtained with a displacements of about 10 (or -10).
  1356.  
  1357.   "count" determines the number of times the movement will be repeated.
  1358. Possible values range from 0 to 32767. A count of 0 performs the
  1359. movement pattern indefinitely.
  1360.  
  1361.   In addition to the above commands, you can also add one of the
  1362. following directives at the end of your movement string.
  1363.  
  1364.   The most important of these extensios is the L instruction (for
  1365. loop), which jumps back to the start of the string and returns the
  1366. entire sequence again from the beginning. Example:
  1367.  
  1368.         Load "AMOS_DATA:Sprits/Octopus.abk" : Get Sprite Palette
  1369.         Sprite 1,130,100,1 : Rem Define Sprite 5
  1370.         Move X 1,"(1,5,60)(1,-5,60)L"
  1371.         Move On
  1372.  
  1373. The E option allows you to stop your object when it reaches a specific
  1374. point on the screen. Change the second to last line in the above
  1375. example to:
  1376.  
  1377.         Move X 1,"(1,5,30)E100"
  1378.  
  1379. Note that these end-points will only work if the x coordinate of the
  1380. object exactly reaches the value you originally designated in the
  1381. instruction. If this increment is badly chosen the object will leap
  1382. past the end-point in a single bound, and the test will fail. Example:
  1383.  
  1384.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  1385.         Channel 1 To Sprite 8 : Channel 2 To Sprite 10
  1386.         Print At(0,5)+"Looping OK"
  1387.         Sprite 8,130,100,1
  1388.         Move X 1,"(1,10,30)(1,-10,30)L"
  1389.         Move On
  1390.         Print At(0,10)+"Now press a key" : Wait Key
  1391.         Sprite 10,140,150,2
  1392.         Move X 2,"(1,15,20)L" : Move On 2
  1393.         Print At(0,15)+"Oh dear!" : Wait Key
  1394.  
  1395.  
  1396.  
  1397.                    MOVE Y (Move an vertical object)
  1398.  
  1399. MOVE Y n,m$
  1400.  
  1401. This instruction complements the MOVE X command by enabling you to move
  1402. an object vertically along the screen. As before, n refers to the
  1403. number of an animation sequence you've allocated using the CHANNEL
  1404. command, and ranges between 0 and 15.
  1405.  
  1406.   m$ holds a movement string in an identical format to MOVE X. Positive
  1407. displacements now correspond to a downward motion, and negative values
  1408. result in an upward movement. Examples:
  1409.  
  1410.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette          205
  1411.         Channel 1 to Sprite 8 : Sprite 8,130,10,1
  1412.         Move Y 1,"10(1,1,180)L"
  1413.         Channel 2 To Screen Display 0
  1414.         Move Y 2,"(1,4,25)(1,-4,25)
  1415.         Move On : Wait Key
  1416.  
  1417.  
  1418.  
  1419.                   MOVE ON/OFF (start/stop movements)
  1420.  
  1421. MOVE ON/OFF [n]
  1422.  
  1423. Before your movement patterns will be executed they need to be
  1424. activated using the MOVE ON command.
  1425.  
  1426.   "n" refers to the animation sequence you wish to start, and can range
  1427. from 0 to 15. If it's omitted then all your movements will be activated
  1428. simultaneously.
  1429.  
  1430.   MOVE OFF has exactly the opposite effect: It stops the relecant
  1431. movement sequences in their tracks.
  1432.  
  1433.  
  1434.  
  1435.           MOVE FREEZE (temporatily suspend sprite movements)
  1436.  
  1437. MOVE FREEZE [n]
  1438.  
  1439. The MOVE FREEZE command temporarily halts the movements of one or more
  1440. objects on the screen. These objects can be restarted again using 
  1441. MOVE ON. 
  1442.  
  1443.   "n" is completely optional and specifiew the number of a single
  1444. object to be suspended by this instruction.
  1445.  
  1446.  
  1447.  
  1448.                     =MOVON (return movement status)
  1449.  
  1450. x=MOVON(n)
  1451.  
  1452. MOVON checks whether a particular object is being moved by the MOVE X
  1453. and MOVE Y instructions. It returns -1 if object n is in motion, and 0
  1454. if it's stationary. Do not confuse this with the MOVE ON command. Also
  1455. note that MOVON searches for movement patterns generated using the MOVE
  1456. commands, so it will not detect any animations generated by AMAL.
  1457.  
  1458.  
  1459.  
  1460.                        ANIM (animate an object)
  1461.  
  1462. ANIM n,a$
  1463.  
  1464. Automatically flicks an object through a sequence of images creating a
  1465. smooth animation effect on the screen. These animations are performed
  1466. 50 times a second using interrupts, so they can be executed
  1467. simultaneously with your Basic programs.
  1468.  
  1469.   "n" is the number of the channel which specifies a sprite or bob to
  1470. be animated by this instruction.
  1471.  
  1472.   "a$" contains a series of instructions which define your animation
  1473. sequence. Each operation is split into two separate components enclosed
  1474. between round brackets.
  1475.  
  1476.   "image" is number of the image to be displayed during each frame of      206
  1477. the animation. "delay" specifies the length of time this image will be
  1478. hled on the screen (in 50ths of a sec.). Example:
  1479.  
  1480.         Load "AMOS_DATA:Sprites/Octopus.abk" : Get Sprite Palette
  1481.         Channel 1 to Sprite 8 : Sprite 8,200,100,1
  1482.         Anim 1,"(1,10)(2,10)(3,10)(4,10)"
  1483.         Anim On : Wait Key
  1484.  
  1485. Just as with the MOVE instruction, there's also an L directive which
  1486. enables you to repeat your animations continuously. So just change the
  1487. ANIM command in the previous example to the following:
  1488.  
  1489.         Anim 1,"(1,10)(2,10)(3,10)(4,10)L"
  1490.  
  1491.  
  1492.  
  1493.                    ANIM ON/OFF (start an animation)
  1494.  
  1495. ANIM ON/OFF [n]
  1496.  
  1497. ANIM ON activates a series of animations which have been previously
  1498. created using the ANIM command. n specifies the number of an individual
  1499. animation sequence to be initialised. If it's omitted, then all current
  1500. animation sequences will be started immediately.
  1501.  
  1502. ANIM OFF [n]
  1503.  
  1504. Halts one or more animation sequences started by ANIM ON.
  1505.  
  1506.  
  1507.  
  1508.                    ANIM FREEZE (freeze an animation)
  1509.  
  1510. ANIM FREEZE [n]
  1511.  
  1512. Temporarily freezes the current animation sequence on the screen. n
  1513. chooses a single animation sequence to be suspended. If it's not
  1514. included, all current animations will be affected. They can be
  1515. restarted at any time with a simple call to the ANIM ON instruction.
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.                         15: BACKGROUND GRAPHICS                            207
  1525.                     ------------------------------
  1526.  
  1527. Nowadays, it's not uncommon for an arcade game to contain hunderds of
  1528. different screens. With compaction, it's possible to crap a single 32
  1529. colour screen into about 30k of memory. So 100 screens would be the
  1530. equivalent of about 3 Megabytes of data. Imagine how difficult this
  1531. would be to fit into a standard A500! 
  1532.  
  1533.   The classic way of avoiding this restriction, is to construct your
  1534. backgrounds out of a set of simple building blocks. Once these "tiles"
  1535. have been created, they can be placed on the screen in any order you
  1536. like. So the same set of tiles can be reused to generate a vast number
  1537. of potential screens. Each screen is now stored as a simple list of its
  1538. components, and requires a tiny fraction of the original memory.
  1539.  
  1540.   In order to exploit this system, you'll obviously need some way of
  1541. defining your various screen maps. As you might have guessed, we've
  1542. helpfully provided you with a powerful map definer accessory on the
  1543. AMOS program disc. Full details can be found in the accompanying
  1544. documentation file.
  1545.  
  1546.   AMOS Basic also includes a number of special instructions for drawing
  1547. your tiles on the screen. These make it easy to generate the fast
  1548. scrolling backgrounds that are the hallmark of a modern arcade game.
  1549.  
  1550.  
  1551. Icons
  1552. =====
  1553. Icons are separate images which have been especially designed for
  1554. producing your background screens. Once you've drawn an icon, it's
  1555. fixed permanently into place. So you can't move it to a new position
  1556. using the AMAL animation system.
  1557.  
  1558.   All icons are stored in their own AMOS memory bank (#2). This bank is
  1559. created using the Sprite definer accessory (on the AMOS Program disk),
  1560. and will be automatically saved along with your Basic programs.
  1561.  
  1562.   Like Bobs, Icons are displayed using the Amiga's amazing Blitter
  1563. chip. But since Icons are essentally static objects, they are usually
  1564. drawn in REPLACE mode. Your icons will therefore totally erase any
  1565. existing graphics at the current screen position.
  1566.  
  1567.  
  1568.  
  1569.                        PASTE ICON (draw an icon)
  1570.  
  1571. PASTE ICON x,y,n
  1572.  
  1573. Draws icon number n on the screen at GRAPHIC coordinates x,y. n is the
  1574. number of the icon which is to be displayed. This must have been
  1575. previously stored in the ICON bank. 
  1576.  
  1577.   Icons can be freely positioned anywhere on the screen, subject to the
  1578. normal clipping rules. Example:
  1579.  
  1580.         Load "AMOS_DATA:Icons/Map_icons.abk"
  1581.         Screem Open 0,320,256,32,Lowres : Cls 0 : Get Icon Palette
  1582.         For X=1 To 11 : Paste Icon X*32,0,1 : Next X
  1583.         For Y=1 To 6 : Paste Icon 0,Y*32+11 : Paste Icon 288,Y*32,1
  1584.         Next Y
  1585.         For X=1 To 11 : Paste Icon X*32,223,1 : Next X
  1586.  
  1587. Note that if you're using double buffering, a copy of your icons will
  1588. be drawn into both the physical and logical screens. Since this is
  1589. rather slow, it's common practive to add a call to AUTOBACK 0 before
  1590. drawing your icons on the screen. This restricts straight to the
  1591. physical screen using SCREEN COPY, saving a considerable amount of
  1592. time. 
  1593.  
  1594.   For a further example, see the MAPVIEW program on the AMOS DATA disc.
  1595. This displays a background screen you've created using the AMOS Map
  1596. Editor.
  1597.  
  1598.  
  1599.  
  1600.                        GET ICON (create an icon)                           208
  1601.  
  1602. GET ICON [s,] i,tx,ty TO bx,by
  1603.  
  1604. Captures an image from the screen and loads it into icon "i". If this
  1605. icon does not presently exist, it will be created for you in bank 2.
  1606. This bank will be automatically reserved by the system if required.
  1607.  
  1608.   i is the number of your icon, starting from 1. tx,ty to bx,by define
  1609. the rectangular zone which encloses the selected region.
  1610.  
  1611.   s determines the number of the screen which will be used as the
  1612. source of your image. If it's omitted, the image will be taken from the
  1613. current screen instead. Example:
  1614.  
  1615.         Erase 2
  1616.         F$=Fsel$("*.*","","Load a screen") : If F$="" Then Direct
  1617.         If Exist(f$) Then Load Iff f$,0 Else Direct
  1618.         SH=Screen Height : H=SH/32-1 : SW=Screen Width : W=SW/32-1
  1619.         For Y=0 to H
  1620.           For X=0 to W
  1621.             Get Icon X+Y*W+1,X*32,Y*32 To X*32+31,Y*32+31
  1622.           Next X
  1623.         Next Y
  1624.         Cls 0
  1625.         Do
  1626.           Paste Icon Rnd(Sw-1),Rnd(SH-1),Rnd/(H*W)+1
  1627.         Loop
  1628.  
  1629.  
  1630.  
  1631.                   GET ICON PALETTE (get icon colours)
  1632.  
  1633. GET ICON PALETTE
  1634.  
  1635. Grabs the colours of the icon images in bank 2, and loads them into the
  1636. current screen palette. This command is normally used to initialize the
  1637. screen after you'be loaded some icons from the disc. Example:
  1638.  
  1639.         Load "AMOS_DATA:Icons/Map_icons.abk"
  1640.         Get Icon Palette
  1641.         Paste Icon 100,100,1
  1642.  
  1643.  
  1644.  
  1645.                        DEL ICON (deletes icons)                            209
  1646.  
  1647. DEL ICON n[ TO m]
  1648.  
  1649. Deletes one or more icons from the icon bank. n is the number of the
  1650. first icon to be removed. 
  1651.  
  1652.   m is the optional number of the last icon to be deleted in the list.
  1653. If it's included all the icons from first to last will be erased one
  1654. after another.
  1655.  
  1656.   When the final icon in a bank has been deleted, the entire bank will
  1657. be removed from memory.
  1658.  
  1659.  
  1660.  
  1661.             MAKE ICON MASK (set colour zero to transparent)
  1662.  
  1663. MAKE ICON MASK [n]
  1664.  
  1665. Normally, any icons you draw on the screen will completely replace the
  1666. existing background. The icon will seem to be displayed in a
  1667. rectangular box filled with colour zero.
  1668.  
  1669.   If you want to avoid this effect and overlay your icons directly over
  1670. the current graphics, you'll need to create a *mask* for your icons.
  1671. This informs AMOS that colour zero should be treated as transparent.
  1672.  
  1673.   n is the number of the icon to be affected. If it's omitted, a mask
  1674. will be defined for all icons in the bank. See EXAMPLE 15.1
  1675.  
  1676.  
  1677. Screen blocks
  1678. =============
  1679. AMOS Basic supplies you with a set of powerful BLOCK commands which
  1680. allow you to grab part of an image into memory and paste it anywhere on
  1681. the screen.
  1682.  
  1683.         These instructions are mainly used for holding temporary data,
  1684. since your blocks cannot be saved along with your Basic programs.
  1685.  
  1686.   Blocks are especially effective in the construction of dialogue
  1687. boxes, as they can be used to save the background areas before
  1688. displaying your new graphics. 
  1689.  
  1690.   They can also be exploited in puzzle games like Split Personalities.
  1691. Each block can be loaded with a single section of your image. You can
  1692. then jumble your pictures by rearranging the blocks on the screen with
  1693. PUT BLOCK.
  1694.  
  1695.  
  1696.  
  1697.               GET BLOCK (grab a screen block into memory)
  1698.  
  1699. GET BLOCK n,tx,ty,w,h[,mask]
  1700.  
  1701. GET BLOCK grabs a rectangular area in block number n, starting at
  1702. coordinates tx,ty. 
  1703.  
  1704.   n is the number of the block ranging from 1-65535. tx, ty set the
  1705. coordinates of the top left hand corner of your block. w,y hold the
  1706. width and height of the block respectively.
  1707.  
  1708.   "mask" is a flag which chooses whether a mask will be created for
  1709. your new block.
  1710.  
  1711.   mask=0        Replace mode. When the block is drawn on the screen,
  1712.                 it will totally destroy any graphics at that current
  1713.                 position.
  1714.   mask=1        Calculates a mask for the block. Colour zero will now
  1715.                 be treated as if it were transparent.
  1716.  
  1717.  
  1718.  
  1719.                 PUT BLOCK (copies a previously created                     210
  1720.                         block onto the screen)
  1721.  
  1722. PUT BLOCK n[,x,y]
  1723. PUT BLOCK n,x,y,planes[,minterms]
  1724.  
  1725. PUT BLOCK copies block number n to the current screen. x,y specify the
  1726. position of your new block on the screen. If they are omitted the block
  1727. will be redrawn at its original screen coordinates.
  1728.  
  1729.   Note that all drawing operations will be clipped to fit into the
  1730. current screen, starting from the nearest 16 pixel boundary.
  1731.  
  1732.   For a demostration of the BLOCK commands see the routine in EXAMPLE
  1733. 15.2. We've also provided experienced programmers with a couple of
  1734. optional extras. These are not needed for the vast majority of
  1735. applications, they're only required when you want to achieve weird
  1736. special effects on the screen!
  1737.  
  1738.   "planes" holds a bit-map which sets the range of colours which will
  1739. be drawn in your block. The Amiga's screen is divided up into segments
  1740. known as bit-planes. Each plane contains a single bit for every point
  1741. on the Amiga's screen. When the Amiga's hardware displays this point,
  1742. it combines the bits from each plane to calculate the required colour
  1743. number. Each bit in "planes" represents the status of a single
  1744. bit-plane. If it's set to one, then the selected plane will be drawn by
  1745. the instruction, otherwise it will be completely ignored. The first
  1746. plane is represented by bit zero, the second by bit one, etc.
  1747.  
  1748.   Usually, the block will be displayed in all the available bit-planes.
  1749. The corresponds to a bit-pattern of %111111
  1750.  
  1751.   "minterm" selects the blitter mode used to copy your block on the
  1752. screen. A full description of the possible drawing modes can be found
  1753. in the section on SCREEN COPY. The best way to loearn about these
  1754. options is to experiment!
  1755.  
  1756.  
  1757.  
  1758.                    DEL BLOCK (delete a screen block)
  1759.  
  1760. DEL BLOCK n
  1761.  
  1762. Deletes one or more blocks and restores the memory used to AMOS Basic.
  1763.  
  1764. DEL BLOCK       Erases *all* current blocks
  1765. DEL BLOCK n     Deletes block number n.
  1766.  
  1767.  
  1768.  
  1769.              GET CBLOCK (save and compact a screen image)                  211
  1770.  
  1771. GET BLOCK n,x,y,sx,sy
  1772.  
  1773. The GET BLOCK command saves and compacts a rectangular area of the
  1774. screen. The compaction system used by this command has been especially
  1775. optimized for speed. So it's nowhere near as efficient as the dedicated
  1776. AMOS compression routines provided by the PACK or SPACK instructions.
  1777.  
  1778.   CBLOCKS are often used to grab the area underneath your dialogue
  1779. boxes. After the dialogue has been completed, the screen can quickly
  1780. restored back to its original state. See EXAMPLE 15.3.
  1781.  
  1782.   n specifies the number of your block and can range between 1-65535.
  1783.  
  1784.   x,y are the top left coordinates. The x coordinate is rouded to the
  1785. nearest multiple of 8.
  1786.  
  1787.   w,h hold the dimensios of the area to be saved. The width is always
  1788. rounded to an exact multiple of 8.
  1789.  
  1790.  
  1791.  
  1792.                      PUT CBLOCK (displays a block
  1793.                          created using CBLOCK)
  1794.  
  1795. PUT CBLOCK n [,x,y]
  1796.  
  1797. Places block n on the current screen at coordinates x,y. If the target
  1798. coordinates are omitted, the block will be redrawn at its original
  1799. screen position. Also note that x is automatically rounded to the
  1800. nearest eight pixel boundary.
  1801.  
  1802.  
  1803.  
  1804.                   DEL CBLOCK (deletes a screen block
  1805.                        defined with GET CBLOCK)
  1806.  
  1807. DEL CBLOCK [n]
  1808.  
  1809. Erases all blocks from memory. If n is present only block n will be
  1810. deleted.
  1811.